const jwt = require('jsonwebtoken');
const { User } = require('../models');
const JWT_SECRET = process.env.JWT_SECRET;

const authenticateToken = (req, res, next) => {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];

  if (!token) return res.status(401).json({ 
    success: false,
    error: '需要认证', 
    message: '请提供有效的认证令牌',
    instructions: {
      description: '请在请求头中添加正确的Authorization头:',
      format: 'Authorization: Bearer YOUR_JWT_TOKEN',
      get_token: '您可以通过登录接口获取令牌：',
      login_endpoints: [
        '普通用户登录: POST /api/auth/login',
        '管理员登录: POST /api/auth/admin/login'
      ]
    }
  });

  jwt.verify(token, JWT_SECRET, async (err, decoded) => {
    if (err) {
      // 根据错误类型返回不同的错误信息
      if (err.name === 'TokenExpiredError') {
        return res.status(401).json({ 
          success: false,
          error: '令牌已过期', 
          message: '您的登录会话已过期，请重新登录获取新的令牌',
          instructions: {
            description: '请重新登录获取新的令牌:',
            login_endpoints: [
              '普通用户登录: POST /api/auth/login',
              '管理员登录: POST /api/auth/admin/login'
            ]
          }
        });
      } else {
        return res.status(403).json({ 
          success: false,
          error: '无效的令牌', 
          message: '认证令牌无效或格式错误',
          instructions: {
            description: '请确保：',
            points: [
              '您使用的是有效的JWT令牌',
              'Authorization头的格式为 "Bearer YOUR_JWT_TOKEN"',
              '令牌是从最近的登录响应中获取的',
              '没有额外添加或删除任何字符'
            ]
          }
        });
      }
    }
    
    try {
      // 验证用户是否存在
      const user = await User.findByPk(decoded.id);
      if (!user) {
        return res.status(404).json({ 
          success: false,
          error: '用户不存在', 
          message: '令牌对应的用户不存在或已被删除',
          instructions: '请使用有效的用户账号重新登录'
        });
      }
      
      req.user = decoded;
      next();
    } catch (error) {
      console.error('认证错误:', error);
      return res.status(500).json({ 
        success: false,
        error: '认证过程中出错', 
        message: '服务器在处理认证请求时遇到错误',
        detail: error.message
      });
    }
  });
};

// 检查用户是否为管理员
const isAdmin = async (req, res, next) => {
  try {
    // 首先检查JWT中的isAdmin字段
    if (req.user.isAdmin === true) {
      next();
      return;
    }
    
    // 如果JWT中没有isAdmin字段或为false，再查询数据库进行二次确认
    const user = await User.findByPk(req.user.id);
    if (user && user.isAdmin) {
      // 更新req.user中的isAdmin信息
      req.user.isAdmin = true;
      next();
    } else {
      res.status(403).json({ 
        success: false,
        error: '需要管理员权限', 
        message: '当前操作需要管理员权限',
        instructions: {
          description: '您当前使用的是普通用户账号，无法访问管理员功能',
          solutions: [
            '如果您有管理员账号，请使用管理员账号登录',
            '如需创建管理员账号，请使用 POST /api/auth/admin/register 接口（需要管理员注册密钥）'
          ]
        }
      });
    }
  } catch (error) {
    console.error('权限检查错误:', error);
    res.status(500).json({ 
      success: false,
      error: '权限检查过程中出错', 
      message: '服务器在验证管理员权限时遇到错误',
      detail: error.message
    });
  }
};

module.exports = {
  authenticateToken,
  isAdmin
};  